package com.ysx.student.fangyahao.day202120908;

import java.util.Scanner;

public class Ch01 {

    public static int getMax(int[] num){
        Scanner sc=new Scanner(System.in);
        int max=num[0];
        for(int i=1;i<num.length;i++){

            // 比较并得到最大值
            if(max<num[i]){
                max=num[i];
            }
        }

        // 输出结果
        return max;
    }

    public static int getFactorialByWhile(int n){

        // 初始化阶乘
        int fac=1;

        // 循环相乘
        int i=1;
        while(i<=n){
            fac*=i;
            i++;
        }

        // 输出阶乘
        return fac;
    }

    public static int getFactorialByDoWhile(int n){

        // 初始化阶乘
        int fac=1;

        // 循环相乘
        int i=1;
        do{
            fac*=i;
            i++;
        }while(i<=n);

        // 输出阶乘
        return fac;
    }

    public static int getFactorialByFor(int n){

        // 初始化阶乘
        int fac=1;

        // 循环相乘
        for(int i=1;i<=n;i++){
            fac*=i;
        }

        // 输出阶乘
        return fac;
    }

    public static int getMulSum(int num,int interval){
        int sum=0;
        for(int i=1;i<=num-interval+1;i=i+interval-1){
            int fac=1;
            for(int j=0;j<interval;j++){

                // 相乘
                fac*=(i+j);
            }

            // 相加
            sum+=fac;
        }
        // 输出结果
        return sum;
    }

    public static int getFactorialSum(int n){
        int sum=0;

        for(int i=1;i<=n;i++){
            // 初始化阶乘
            int fac=1;

            // 循环相乘
            for(int j=1;j<=i;j++){
                fac*=j;
            }

            // 计算和
            sum+=fac;
        }

        return sum;
    }

    public static void printLettersNum(String str){
        int upperNum=0;
        int lowerNum=0;

        // 字符串转换为字符数组
        char[] charList=str.toCharArray();

        // 对每个字符进行匹配
        for(int i=0;i<charList.length;i++){
            if(charList[i]>='a'&&charList[i]<='z'){
                lowerNum++;
            }else if(charList[i]>='A'&&charList[i]<='Z'){
                upperNum++;
            }
        }

        // 分别输出大、小写字母的个数
        System.out.println("该字符串之中大写字母的个数:"+upperNum+" 小写字母的个数:"+lowerNum);
    }

    public static void printIntegerNum(int num){
        int[] numList=new int[num];
        int posNum=0;
        int negNum=0;
        int zeroNum=0;

        for(int i=0;i<numList.length;i++){
            // 输入num个整数
            Scanner sc=new Scanner(System.in);
            System.out.println("请输入第"+(i+1)+"个整数:");
            numList[i]=sc.nextInt();

            // 匹配
            if(numList[i]==0){
                zeroNum++;
            }else if(numList[i]>0){
                posNum++;
            }else{
                negNum++;
            }
        }

        // 输出结果
        System.out.println("总共有"+posNum+"个正数"+negNum+"个负数"+zeroNum+"个零");
    }

    public static void printCharactersNum(String str){
        int letterNum=0;
        int spaceNum=0;
        int numberNum=0;
        int elseNum=0;


        // 字符串转换为字符数组
        char[] charList=str.toCharArray();

        // 对每个字符进行匹配
        for(int i=0;i<charList.length;i++){
            if(charList[i]>='a'&&charList[i]<='z'||charList[i]>='A'&&charList[i]<='Z'){
                letterNum++;
            }else if(charList[i]==' '){
                spaceNum++;
            }else if(charList[i]>='0'&&charList[i]<='9'){
                numberNum++;
            }else{
                elseNum++;
            }
        }

        // 分别输出英文字母、空格、数字、和其他字符的个数
        System.out.println("该字符串:英文字母的个数:"+letterNum+" 空格的个数:"+spaceNum+" 数字的个数:"+numberNum+" 其他字符的个数:"+elseNum);
    }

    public static void printIntegerDigitsAndReverse(int num){
        int flag=1;
        int digit=0;
        int reverseNum=0;
        int initalNum=num;
        do{
            if(num/10>0){
                // 计算整数位数
                digit++;

                // 整数逆序
                reverseNum=(num%10+reverseNum)*10;

                num/=10;
            }else{

                // 计算整数位数 个位
                digit++;

                // 整数逆序
                reverseNum+=num;
                flag=0;
            }
        }while(flag==1);

        // 输出结果
        System.out.println(initalNum+"是"+digit+"位数 逆序输出为:"+reverseNum);
    }

    public static void printNarcissisticNum(int begin,int end){
        int num;
        int cubicSum;
        System.out.println(begin+"和"+end+"之间的水仙花数有:");
        for(int i=begin;i<=end;i++){
            num=i;
            cubicSum=0;

            // 计算立方和
            while(num/10>0){
                cubicSum+=(num%10)*(num%10)*(num%10);
                num/=10;
            }
            cubicSum+=(num)*(num)*(num);

            // 比较
            if(cubicSum==i){

                //输出
                System.out.print(i+" ");
            }
        }
    }

    public static int getStepsNum(){
        int stepNum=0;
        while (stepNum>=0){

            // 判断是否符合
            if(stepNum%2==1&&stepNum%3==2&&stepNum%5==4&&stepNum%6==5&&stepNum%7==0){

                // 符合就结束
                break;
            }else{

                // 不符合就下一个
                stepNum++;
            }
        }

        // 输出结果
        return stepNum;
    }

    public static boolean isPalindromeNumber(int num){
        int flag=1;
        int digit=0;
        int reverseNum=0;
        int initalNum=num;
        do{
            if(num/10>0){
                // 整数逆序
                reverseNum=(num%10+reverseNum)*10;

                num/=10;
            }else{

                // 整数逆序
                reverseNum+=num;
                flag=0;
            }
        }while(flag==1);

        // 输出结果
        return initalNum==reverseNum;
    }

    public static boolean isPalindromeNumber(String s){
        char[] chars=s.toCharArray();
        int flag=1;
        for(int i=0;i<=chars.length/2;i++){
            if(chars[i]!=chars[chars.length-1-i]){
                flag=0;
                break;
            }
        }
        return flag==1;
    }

    public static void printCubicSumIsNumber(int begin,int end,int number){
        int num;
        int cubicSum;
        System.out.println(begin+"和"+end+"之间的各位数的立方和等于"+number+"的数有:");
        for(int i=begin;i<=end;i++){
            num=i;
            cubicSum=0;

            // 计算立方和
            while(num/10>0){
                cubicSum+=(num%10)*(num%10)*(num%10);
                num/=10;
            }
            cubicSum+=(num)*(num)*(num);

            // 比较
            if(cubicSum==number){

                //输出
                System.out.print(i+" ");
            }
        }
    }

    public static void printLeapYear(int begin,int end){
        System.out.println(begin+"年和"+end+"年之间的闰年有:");
        for(int i=begin;i<=end;i++){

            // 判断
            if(i%400==0||i%4==0&&i%100!=0){

                // 输出
                System.out.print(i+"年 ");
            }
        }

    }

    public static void printPrimeNumber(int begin,int end){
        System.out.println(begin+"和"+end+"之间的素数有:");

        // 约束条件
        if(begin<=1){
            begin=2;
        }
        for(int i=begin;i<=end;i++){
            int flag=0;
            for(int j=2;j<i;j++){

                // 判断
                if(i%j==0){
                    flag=1;
                    break;
                }
            }
            if(flag==0||i==2){

                // 输出
                System.out.print(i+" ");
            }

        }

    }

    /**
     * 倒等腰三角形
     * @param num 行数
     */
    public static void printInverseIsoscelesTriangle(int num){
        for(int i=0;i<num;i++){
            for(int j=1;j<=i;j++){
                System.out.print("\t");
            }
            for(int j=1;j<=2*(num-i)-1;j++){
                System.out.print("*\t");
            }
            System.out.println();
        }
    }

    /**
     * 等腰三角形
     * @param num 行数
     */
    public static void printIsoscelesTriangle(int num){
        for(int i=num;i>=0;i--){
            for(int j=1;j<=i;j++){
                System.out.print("\t");
            }
            for(int j=1;j<=2*(num-i)-1;j++){
                System.out.print("*\t");
            }
            System.out.println();
        }
    }

    /**
     * 菱形
     * @param num 边长
     */
    public static void printDiamond(int num){
        for(int i=num-1;i>=0;i--){
            for(int j=1;j<=i;j++){
                System.out.print("\t");
            }
            for(int j=1;j<=2*(num-i)-1;j++){
                System.out.print("*\t");
            }
            System.out.println();
        }
        for(int i=1;i<=num-1;i++){
            for(int j=1;j<=i;j++){
                System.out.print("\t");
            }
            for(int j=1;j<=2*(num-i)-1;j++){
                System.out.print("*\t");
            }
            System.out.println();
        }
    }

    /**
     * 空心菱形
     * @param num
     */
    public static void printHollowDiamond(int num){
        for(int i=num-1;i>=0;i--){
            for(int j=1;j<=i;j++){
                System.out.print("\t");
            }
            for(int j=1;j<=2*(num-i)-1;j++){
                if(j==1||j==2*(num-i)-1){
                    System.out.print("*\t");
                }else {
                    System.out.print("\t");
                }
            }
            System.out.println();
        }
        for(int i=1;i<=num-1;i++){
            for(int j=1;j<=i;j++){
                System.out.print("\t");
            }
            for(int j=1;j<=2*(num-i)-1;j++){
                if(j==1||j==2*(num-i)-1){
                    System.out.print("*\t");
                }else {
                    System.out.print("\t");
                }
            }
            System.out.println();
        }
    }

    public static void printMulTable(int num){
        for(int i=1;i<=num;i++){
            for(int j=1;j<=i;j++){
                System.out.print(i+"×"+j+"="+(i*j)+"\t");
            }
            System.out.println();
        }
    }

    /**
     * 三色球
     * @param red 红球总数
     * @param white 白球总数
     * @param black 黑球总数
     * @param choiseNum 选球总数
     */
    public static void printTricolorePlan(int red,int white,int black,int choiseNum){
        for(int i=0;i<=red;i++){
            for(int j=0;j<=white;j++){
                for(int k=0;k<=black;k++){
                    if((i+j+k)==choiseNum){
                        System.out.println("红球:"+i+"个 白球:"+j+"个 黑球:"+k+"个");
                    }
                }
            }
        }
    }

    /**
     百钱百鸡
     * @param rooster 公鸡单价
     * @param hen 母鸡单价
     * @param chick 小鸡数/元
     * @param money 金钱总数
     * @param num 鸡的总数
     */
    public static void printHundredChickensPlan(int rooster,int hen,int chick,int money,int num){
        for(int i=0;i<=money/rooster;i++){
            for(int j=0;j<=money/hen;j++){
                for(int k=0;k<=num;k++){
                    if((i*rooster+j*hen+k/chick)==money&&(i+j+k)==num&&k%chick==0){
                        System.out.println("公鸡:"+i+"只 母鸡:"+j+"只 小鸡:"+k+"只");
                    }
                }
            }
        }
    }

    /**
     百马百担
     * @param big 大马的担数
     * @param middle 中马的担数
     * @param small 小马数/担
     * @param bear 总担数
     * @param num 马的总数
     */
    public static void printHundredHorsesPlan(int big,int middle,int small,int bear,int num){
        for(int i=0;i<=bear/big;i++){
            for(int j=0;j<=bear/middle;j++){
                for(int k=0;k<=num;k++){
                    if((i*big+j*middle+k/small)==bear&&(i+j+k)==num&&k%small==0){
                        System.out.println("大马:"+i+"只 中马:"+j+"只 小马:"+k+"只");
                    }
                }
            }
        }
    }

    public static int[] sort(int[] array){
        int length=array.length;
        for(int i=0;i<length;i++){
            for(int j=i+1;j<length;j++){
                if(array[j]<array[i]){
                    int temp=array[i];
                    array[i]=array[j];
                    array[j]=temp;
                }
            }
        }

        return array;
    }

    public static int[] removeDuplication(int[] array){
        array=sort(array);
        int count=0;
        int length=array.length;
        for(int i=0;i<length;i++){
            for(int j=i+1;j<length;j++){
                if(array[i]==array[j]){
                    count++;
                }else{
                    i=j;
                }
            }
        }
        int[] newArray=new int[length-count];
        for(int i=0,k=0;i<length;i++){
            if(i==0||i>0&&array[i-1]!=array[i]){
                newArray[k]=array[i];
                k++;
            }
        }
        return newArray;
    }

    public static void printCombinedNumberPlan(int[] array){

        array=removeDuplication(array);
        int count=0;
        int length = array.length;
        for(int i=0;i<length;i++){
            if(array[i]!=0){
                for(int j=0;j<length;j++){
                    for(int k=0;k<length;k++){
                        if(i!=j&&j!=k&&i!=k){
                            int rs=array[i]*100+array[j]*10+array[k];
                            System.out.print(rs+"\t");
                            count++;
                        }
                    }
                }
                System.out.println();
            }

        }
        System.out.println("总共有"+count+"种组合");
    }

    public static void main(String[] args) {

        // 第1题
        // int[] num={1,2,3,4,5,6,1,5,6,7};
        // System.out.println("最大值是:"+getMax(num));

        // 第2题
        // int n=3;
        // System.out.println(n+"的阶乘:"+getFactorialByFor(n));
        // System.out.println(n+"的阶乘:"+getFactorialByDoWhile(n));
        // System.out.println(n+"的阶乘:"+getFactorialByWhile(n));

        // 第3题
        // System.out.println(getMulSum(101,3));

        // 第4题
        //System.out.println(getFactorialSum(20));

        // 第5题
        // String str="angsajdsla ASLFDJAL F123";
        // printLettersNum(str);

        // 第6题
        // printIntegerNum(10);

        // 第7题
        // String str="fasl djALS DF12315 23是开放力度@#$%";
        // printCharactersNum(str);

        // 第8题
        //printIntegerDigitsAndReverse(10086);

        // 第9题
        // printNarcissisticNum(100,999);

        // 第10题
        //System.out.println("最少的是"+getStepsNum()+"阶");

        // 第11题
        // if(isPalindromeNumber(12321)){
        //     System.out.println("是回文数");
        // }else{
        //     System.out.println("不是回文数");
        // }

        // if(isPalindromeNumber("12321")){
        //     System.out.println("是回文数");
        // }else{
        //     System.out.println("不是回文数");
        // }

        // 第12题
        // printCubicSumIsNumber(100,999,1099);

        // 第13题
        // printLeapYear(1900,2000);

        // 第14题
        // printPrimeNumber(100,200);

        // 第15题
        //printIsoscelesTriangle(5);
        //printInverseIsoscelesTriangle(5);
        //printDiamond(5);
        //printHollowDiamond(5);

        // 第16题
        //printMulTable(9);

        // 第17题
        // printTricolorePlan(3,3,6,8);

        // 第18题
        // printHundredChickensPlan(5,3,3,100,100);

        // 第19题
        // printHundredHorsesPlan(3,2,2,100,100);

        // 第20题
        // int[] array={1,2,3,4};
        // printCombinedNumberPlan(array);

    }
}
